2025-04-01 18:05:30,885 - INFO - Num classes: 3
2025-04-01 18:05:30,885 - INFO - Class weights: None
2025-04-01 18:05:31,073 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-04-01 18:05:31,073 - INFO - Using cuda device
2025-04-01 18:06:23,682 - INFO - Num classes: 3
2025-04-01 18:12:22,710 - INFO - Class weights: tensor([0.5455, 2.7088, 1.2537], device='cuda:0')
2025-04-01 18:12:22,765 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-04-01 18:12:22,765 - INFO - Using cuda device
2025-04-01 18:21:50,504 - INFO - Epoch: 0/100. Training time: 371.490
2025-04-01 18:21:50,505 - INFO - Training Metrics...
2025-04-01 18:21:50,506 - INFO - {'loss': 0.8863425748363422, 'f1': 53.20555672982141, 'acc': 59.882360587547126, 'precision': 53.75058228103177, 'recall': 59.503595223204684, 'balanced acc': 59.503595223204684}
2025-04-01 18:21:50,506 - INFO - Validation Metrics... Inference time: 196.242
2025-04-01 18:21:50,506 - INFO - {'loss': 0.8280419707298279, 'f1': 73.98018505366495, 'acc': 87.17366153192046, 'precision': 76.58207202209292, 'recall': 73.81784715739634, 'balanced acc': 73.81784715739634}
2025-04-01 18:21:50,506 - INFO - ==================================================
2025-04-01 19:12:25,198 - INFO - Epoch: 5/100. Training time: 372.860
2025-04-01 19:12:25,199 - INFO - Training Metrics...
2025-04-01 19:12:25,199 - INFO - {'loss': 0.6274394385374276, 'f1': 72.9007152710747, 'acc': 79.27152474246067, 'precision': 71.4816291301362, 'recall': 78.13565132966531, 'balanced acc': 78.13565132966531}
2025-04-01 19:12:25,199 - INFO - Validation Metrics... Inference time: 196.578
2025-04-01 19:12:25,199 - INFO - {'loss': 0.5360640226266323, 'f1': 74.79261342640584, 'acc': 85.5975939053506, 'precision': 73.675085220725, 'recall': 78.56613011934618, 'balanced acc': 78.56613011934618}
2025-04-01 19:12:25,199 - INFO - ==================================================
2025-04-01 19:59:31,241 - INFO - Epoch: 10/100. Training time: 368.389
2025-04-01 19:59:31,242 - INFO - Training Metrics...
2025-04-01 19:59:31,242 - INFO - {'loss': 0.5849555833324506, 'f1': 73.28785426153237, 'acc': 78.75887068601327, 'precision': 72.0087578782828, 'recall': 79.83841475721364, 'balanced acc': 79.83841475721364}
2025-04-01 19:59:31,243 - INFO - Validation Metrics... Inference time: 191.158
2025-04-01 19:59:31,243 - INFO - {'loss': 0.4868723566715534, 'f1': 75.66708653790613, 'acc': 85.94572744963371, 'precision': 74.43413957115877, 'recall': 79.36730134655858, 'balanced acc': 79.36730134655858}
2025-04-01 19:59:31,243 - INFO - ==================================================
2025-04-01 20:46:38,420 - INFO - Epoch: 15/100. Training time: 375.589
2025-04-01 20:46:38,421 - INFO - Training Metrics...
2025-04-01 20:46:38,422 - INFO - {'loss': 0.627139537197769, 'f1': 69.90580042630846, 'acc': 77.2726626478617, 'precision': 69.88648067729034, 'recall': 78.343513365038, 'balanced acc': 78.343513365038}
2025-04-01 20:46:38,422 - INFO - Validation Metrics... Inference time: 190.266
2025-04-01 20:46:38,422 - INFO - {'loss': 0.4696665482643323, 'f1': 75.33280630902686, 'acc': 85.73822708169806, 'precision': 74.29509203750916, 'recall': 79.32394877568954, 'balanced acc': 79.32394877568954}
2025-04-01 20:46:38,422 - INFO - ==================================================
2025-04-01 21:33:39,946 - INFO - Epoch: 20/100. Training time: 372.178
2025-04-01 21:33:39,947 - INFO - Training Metrics...
2025-04-01 21:33:39,948 - INFO - {'loss': 0.5938126934561759, 'f1': 72.46154350944892, 'acc': 78.79072035860523, 'precision': 71.48228798790598, 'recall': 78.14831609310939, 'balanced acc': 78.14831609310939}
2025-04-01 21:33:39,948 - INFO - Validation Metrics... Inference time: 191.581
2025-04-01 21:33:39,948 - INFO - {'loss': 0.43210996725620365, 'f1': 75.77175663453475, 'acc': 86.44990147501306, 'precision': 75.12794609051781, 'recall': 78.71541329611883, 'balanced acc': 78.71541329611883}
2025-04-01 21:33:39,948 - INFO - ==================================================
2025-04-01 22:20:17,431 - INFO - Epoch: 25/100. Training time: 369.039
2025-04-01 22:20:17,432 - INFO - Training Metrics...
2025-04-01 22:20:17,433 - INFO - {'loss': 0.5821801594867828, 'f1': 72.29518404513475, 'acc': 78.3977723254907, 'precision': 71.1382358583033, 'recall': 77.73491753061339, 'balanced acc': 77.73491753061339}
2025-04-01 22:20:17,433 - INFO - Validation Metrics... Inference time: 189.727
2025-04-01 22:20:17,433 - INFO - {'loss': 0.4472720836981749, 'f1': 75.56451353785866, 'acc': 86.52796004218996, 'precision': 75.27136221154332, 'recall': 78.27899307368615, 'balanced acc': 78.27899307368615}
2025-04-01 22:20:17,433 - INFO - ==================================================
2025-04-01 23:06:23,561 - INFO - Epoch: 30/100. Training time: 365.549
2025-04-01 23:06:23,562 - INFO - Training Metrics...
2025-04-01 23:06:23,563 - INFO - {'loss': 0.580716658929351, 'f1': 72.19763601672568, 'acc': 79.41953876494864, 'precision': 71.47580329978713, 'recall': 79.12725070371287, 'balanced acc': 79.12725070371287}
2025-04-01 23:06:23,563 - INFO - Validation Metrics... Inference time: 186.331
2025-04-01 23:06:23,563 - INFO - {'loss': 0.42745152574319106, 'f1': 76.07332869760923, 'acc': 86.63844293727104, 'precision': 75.19219638984374, 'recall': 79.30626186187698, 'balanced acc': 79.30626186187698}
2025-04-01 23:06:23,563 - INFO - ==================================================
2025-04-01 23:52:44,410 - INFO - Epoch: 35/100. Training time: 364.574
2025-04-01 23:52:44,411 - INFO - Training Metrics...
2025-04-01 23:52:44,411 - INFO - {'loss': 0.5807459138001606, 'f1': 72.98730818727955, 'acc': 78.7486137966333, 'precision': 71.93990586302374, 'recall': 78.78317548222927, 'balanced acc': 78.78317548222927}
2025-04-01 23:52:44,411 - INFO - Validation Metrics... Inference time: 188.042
2025-04-01 23:52:44,411 - INFO - {'loss': 0.41182413697242737, 'f1': 75.96591097892298, 'acc': 86.34608741333074, 'precision': 74.9955613101412, 'recall': 79.3785165090877, 'balanced acc': 79.3785165090877}
2025-04-01 23:52:44,411 - INFO - ==================================================
2025-04-02 02:15:10,504 - INFO - Num classes: 3
2025-04-02 02:20:41,929 - INFO - Class weights: tensor([0.5455, 2.7088, 1.2537], device='cuda:0')
2025-04-02 02:20:41,997 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-04-02 02:20:41,998 - INFO - Using cuda device
2025-04-02 02:20:42,022 - INFO - Training parameters restored at epoch 22
2025-04-02 02:57:34,011 - INFO - Epoch: 25/100. Training time: 365.954
2025-04-02 02:57:34,015 - INFO - Training Metrics...
2025-04-02 02:57:34,016 - INFO - {'loss': 0.65585005093532, 'f1': 69.64864271895594, 'acc': 77.1257149356558, 'precision': 69.16453967779739, 'recall': 75.26856459265353, 'balanced acc': 75.26856459265353}
2025-04-02 02:57:34,016 - INFO - Validation Metrics... Inference time: 191.108
2025-04-02 02:57:34,016 - INFO - {'loss': 0.4260233854636168, 'f1': 75.957771932784, 'acc': 86.40084339024071, 'precision': 75.21679850628101, 'recall': 79.1168932909224, 'balanced acc': 79.1168932909224}
2025-04-02 02:57:34,016 - INFO - ==================================================
2025-04-02 03:44:33,864 - INFO - Epoch: 30/100. Training time: 373.699
2025-04-02 03:44:33,865 - INFO - Training Metrics...
2025-04-02 03:44:33,866 - INFO - {'loss': 0.5581859691887144, 'f1': 73.36786375784182, 'acc': 79.89766467892892, 'precision': 72.70353882997553, 'recall': 79.39654175848048, 'balanced acc': 79.39654175848048}
2025-04-02 03:44:33,866 - INFO - Validation Metrics... Inference time: 191.088
2025-04-02 03:44:33,866 - INFO - {'loss': 0.40986651793504375, 'f1': 75.98903157517458, 'acc': 86.76737371631344, 'precision': 75.59216894162543, 'recall': 78.37674364537288, 'balanced acc': 78.37674364537288}
2025-04-02 03:44:33,866 - INFO - ==================================================
2025-04-02 04:31:33,833 - INFO - Epoch: 35/100. Training time: 372.526
2025-04-02 04:31:33,834 - INFO - Training Metrics...
2025-04-02 04:31:33,835 - INFO - {'loss': 0.5961707287533268, 'f1': 70.93897642460153, 'acc': 77.62801054936305, 'precision': 70.2830105811604, 'recall': 77.10269418093215, 'balanced acc': 77.10269418093215}
2025-04-02 04:31:33,835 - INFO - Validation Metrics... Inference time: 193.186
2025-04-02 04:31:33,835 - INFO - {'loss': 0.4275993674229353, 'f1': 75.5509815626241, 'acc': 85.94309568779434, 'precision': 74.23752787901361, 'recall': 79.6968821818401, 'balanced acc': 79.6968821818401}
2025-04-02 04:31:33,835 - INFO - ==================================================
2025-04-02 05:18:16,530 - INFO - Epoch: 40/100. Training time: 366.442
2025-04-02 05:18:16,532 - INFO - Training Metrics...
2025-04-02 05:18:16,532 - INFO - {'loss': 0.5256059086246855, 'f1': 75.04429974202031, 'acc': 82.07470214399454, 'precision': 73.80578659367707, 'recall': 80.05434819759807, 'balanced acc': 80.05434819759807}
2025-04-02 05:18:16,532 - INFO - Validation Metrics... Inference time: 190.382
2025-04-02 05:18:16,533 - INFO - {'loss': 0.39958228438328475, 'f1': 76.10475184268076, 'acc': 86.68911074045002, 'precision': 75.36802634242235, 'recall': 79.16884548034946, 'balanced acc': 79.16884548034946}
2025-04-02 05:18:16,533 - INFO - ==================================================
2025-04-02 06:04:41,150 - INFO - Epoch: 45/100. Training time: 371.935
2025-04-02 06:04:41,151 - INFO - Training Metrics...
2025-04-02 06:04:41,152 - INFO - {'loss': 0.5699673241870419, 'f1': 72.00121504200513, 'acc': 78.24323349961003, 'precision': 71.27654389356412, 'recall': 77.89460137993026, 'balanced acc': 77.89460137993026}
2025-04-02 06:04:41,152 - INFO - Validation Metrics... Inference time: 189.748
2025-04-02 06:04:41,152 - INFO - {'loss': 0.3976475512370085, 'f1': 76.02062689942636, 'acc': 86.75702552655679, 'precision': 75.4178433384802, 'recall': 78.96211058881461, 'balanced acc': 78.96211058881461}
2025-04-02 06:04:41,152 - INFO - ==================================================
2025-04-02 06:50:38,745 - INFO - Epoch: 50/100. Training time: 368.762
2025-04-02 06:50:38,746 - INFO - Training Metrics...
2025-04-02 06:50:38,747 - INFO - {'loss': 0.5569528121097832, 'f1': 72.29786724001757, 'acc': 79.42728220866373, 'precision': 71.09443511872269, 'recall': 78.36575224586625, 'balanced acc': 78.36575224586625}
2025-04-02 06:50:38,747 - INFO - Validation Metrics... Inference time: 187.739
2025-04-02 06:50:38,747 - INFO - {'loss': 0.39905778643412465, 'f1': 75.8851097117918, 'acc': 86.60346350078493, 'precision': 75.17750165663695, 'recall': 78.95395732583368, 'balanced acc': 78.95395732583368}
2025-04-02 06:50:38,747 - INFO - ==================================================
2025-04-02 07:36:41,029 - INFO - Epoch: 55/100. Training time: 365.190
2025-04-02 07:36:41,030 - INFO - Training Metrics...
2025-04-02 07:36:41,030 - INFO - {'loss': 0.5328745902723567, 'f1': 73.54471327841699, 'acc': 80.6073195599896, 'precision': 72.82158541440957, 'recall': 80.18667758348623, 'balanced acc': 80.18667758348623}
2025-04-02 07:36:41,030 - INFO - Validation Metrics... Inference time: 189.313
2025-04-02 07:36:41,031 - INFO - {'loss': 0.39730590658310133, 'f1': 75.977343167319, 'acc': 86.57063035550759, 'precision': 75.24724238556072, 'recall': 79.23142733492077, 'balanced acc': 79.23142733492077}
2025-04-02 07:36:41,031 - INFO - ==================================================
2025-04-02 08:22:57,127 - INFO - Epoch: 60/100. Training time: 365.221
2025-04-02 08:22:57,128 - INFO - Training Metrics...
2025-04-02 08:22:57,129 - INFO - {'loss': 0.5832371028365603, 'f1': 71.18913503168343, 'acc': 77.58028047007018, 'precision': 70.8641140643967, 'recall': 76.16437870746752, 'balanced acc': 76.16437870746752}
2025-04-02 08:22:57,129 - INFO - Validation Metrics... Inference time: 193.623
2025-04-02 08:22:57,129 - INFO - {'loss': 0.4001401051496848, 'f1': 75.9025346821828, 'acc': 86.3380899234694, 'precision': 75.0178553512742, 'recall': 79.35519124534652, 'balanced acc': 79.35519124534652}
2025-04-02 08:22:57,129 - INFO - ==================================================
2025-04-02 08:59:34,508 - INFO - Early stopping criterion met. Stopping training.
2025-04-02 08:59:35,307 - INFO - Initializing final Evaluations:

2025-04-02 09:02:41,040 - INFO - Final validation metrics:
{'f1': 77.19057917578775, 'acc': 87.52700749771061, 'precision': 75.98653531821815, 'recall': 78.90544483822653, 'balanced acc': 78.90544483822653}
2025-04-02 09:03:03,579 - INFO - Final test pixel-wise classification metrics:
{'f1': 76.20033125414912, 'acc': 84.01527075758919, 'precision': 75.44531345928812, 'recall': 81.45657798277061, 'balanced acc': 81.45657798277061}
2025-04-05 02:32:22,466 - INFO - Num classes: 3
2025-04-05 02:32:22,469 - INFO - Class weights: None
2025-04-05 02:32:22,624 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-04-05 02:32:22,624 - INFO - Using cuda device
2025-04-05 02:32:22,660 - INFO - Initializing final Evaluations:

